<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>第四章：Chains模块 - 4.2 LLMChain：最基础的Chain</title>
    <link rel="stylesheet" href="../shared_styles.css">
</head>
<body>
    <div class="container">
        <h2>4.2 LLMChain：最基础的Chain</h2>
        <p><code>LLMChain</code> (在较新版本中，推荐使用 LangChain 表达式语言 LCEL，例如 <code>prompt | llm</code> 的方式) 是Langchain中最基础也是最常用的组合方式。它将一个语言模型（LLM或ChatModel）和一个提示词模板（PromptTemplate或ChatPromptTemplate）组合在一起。</p>
        <p>其工作流程非常简单：</p>
        <ol>
            <li>接收输入变量。</li>
            <li>使用这些变量格式化提示词模板，生成最终的提示。</li>
            <li>将格式化后的提示发送给指定的LLM。</li>
            <li>返回LLM的输出。</li>
        </ol>
        <pre><code class="language-python">
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
# LLMChain 已弃用，我们将直接使用 LCEL: prompt | llm
from dotenv import load_dotenv
import os

# 加载环境变量并初始化Qwen模型
load_dotenv()
api_key = os.environ.get("DASHSCOPE_API_KEY")
if not api_key:
    raise ValueError("DASHSCOPE_API_KEY not found in environment variables.")

qwen_llm = ChatOpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key=api_key,
    model="qwen-plus",
    temperature=0.7
)

# 1. 定义提示词模板
prompt = PromptTemplate.from_template(
    "请为一家专注于 {product_category} 的新公司想一个好名字。"
)

# 2. 创建 Runnable Sequence (LCEL)
chain = prompt | qwen_llm

# 3. 调用 Chain
# invoke方法接受一个字典作为输入，键是提示模板中的变量名
# 对于 prompt | chat_model 组合，输出是一个 AIMessage 对象
result = chain.invoke({"product_category": "环保咖啡"})
print(f"LCEL Chain 的输出 (AIMessage): {result}")
print(f"公司名字建议: {result.content}")


# 另一个例子：使用ChatPromptTemplate和ChatModel
from langchain_core.prompts import ChatPromptTemplate

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个创意写作助手，擅长写故事开头。"),
    ("human", "请写一个关于一只会说话的 {animal} 的故事开头，它生活在 {location}。")
])

chat_chain = chat_prompt | qwen_llm # 使用 LCEL
chat_result = chat_chain.invoke({
    "animal": "猫头鹰",
    "location": "一座古老的图书馆"
})
print(f"\n聊天 LCEL Chain 的输出 (AIMessage): {chat_result}")
print(f"故事开头: {chat_result.content}")
            </code></pre>
        <p>通过 LCEL (<code>prompt | llm</code>)，我们可以更简洁地定义和执行基础的调用序列。LLM的输出（如果是ChatModel，则为<code>AIMessage</code>）可以直接获取其<code>.content</code>属性。</p>
        <div class="navigation">
            <a href="../langchain_tutorial_outline.html">返回目录</a>
            <a href="../chapter4/4-1_what_is_chain.html">上一小节：什么是Chain？</a>
            <a href="../chapter4/4-3_sequential_chains.html">下一小节：Sequential Chains：按顺序链接多个Chain</a>
        </div>
    </div>
</body>
</html>
